
/**
 * Copyright 1996-2004 Edwin Martin <edwin@bitstorm.nl>
 * @author Edwin Martin
 */

package org.bitstorm.gameoflife;

/**
 * Contains some nice Game Of Life shapes.
 * @author Edwin Martin
 */
public class ShapeCollection {
  private static final Shape CLEAR;
  private static final Shape GLIDER;
  private static final Shape SMALLEXPL;
  private static final Shape EXPLODER;
  private static final Shape CELL10;
  private static final Shape FISH;
  private static final Shape PUMP;
  private static final Shape SHOOTER;
  private static final Shape[] COLLECTION;

  static {
    CLEAR = new Shape("Clear", new int[][] {} );
    GLIDER = new Shape("Glider", new int[][] {{1,0}, {2,1}, {2,2}, {1,2}, {0,2}});
    SMALLEXPL = new Shape("Small Exploder", new int[][] {{0,1}, {0,2}, {1,0}, {1,1}, {1,3}, {2,1}, {2,2}});
    EXPLODER = new Shape("Exploder", new int[][] {{0,0}, {0,1}, {0,2}, {0,3}, {0,4}, {2,0}, {2,4}, {4,0}, {4,1}, {4,2}, {4,3}, {4,4}});
    CELL10 = new Shape("10 Cell Row", new int[][] {{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {5,0}, {6,0}, {7,0}, {8,0}, {9,0}});
    FISH = new Shape("Lightweight spaceship", new int[][] {{0,1}, {0,3}, {1,0}, {2,0}, {3,0}, {3,3}, {4,0}, {4,1}, {4,2}});
    PUMP = new Shape("Tumbler", new int[][] {{0,3}, {0,4}, {0,5}, {1,0}, {1,1}, {1,5}, {2,0}, {2,1}, {2,2}, {2,3}, {2,4}, {4,0}, {4,1}, {4,2}, {4,3}, {4,4}, {5,0}, {5,1}, {5,5}, {6,3}, {6,4}, {6,5}});
    SHOOTER = new Shape("Gosper Glider Gun", new int[][] {{0,2}, {0,3}, {1,2}, {1,3}, {8,3}, {8,4}, {9,2}, {9,4}, {10,2}, {10,3}, {16,4}, {16,5}, {16,6}, {17,4}, {18,5}, {22,1}, {22,2}, {23,0}, {23,2}, {24,0}, {24,1}, {24,12}, {24,13}, {25,12}, {25,14}, {26,12}, {34,0}, {34,1}, {35,0}, {35,1}, {35,7}, {35,8}, {35,9}, {36,7}, {37,8}});
    COLLECTION = new Shape[] {CLEAR, GLIDER, SMALLEXPL, EXPLODER, CELL10, FISH, PUMP, SHOOTER};
  }

  /**
   * Get array of shapes.
   * 
   * It's not tamper-proof, but that's okay.
   * @return collection of shapes
   */
  public static Shape[] getShapes() {
    return COLLECTION;
  }
  
  /**
   * Get shape by its name.
   * @param name name of shape
   * @return shape object
   * @throws ShapeException if no shape with this name exist
   */
  public static Shape getShapeByName( String name ) throws ShapeException {
    Shape[] shapes = getShapes();
    for ( int i = 0; i < shapes.length; i++ ) {
      if ( shapes[i].getName().equals( name )  )
        return shapes[i];
    }
    throw ( new ShapeException("Unknown shape: "+name) );
  }
}